/**
 * string utilities
 * Copyright (c) 2009 cmiscm.com
 * date of final modification : 2008. 07. 27
*/
package com.cmiscm.utils.common
{
	import flash.text.TextField;	
	
	/**
	 * String Utilities.
     * 
     */
	public class StringUtilities 
	{
		/**
		 * \n \r convert &lt;br&gt;
		 * <p>
		 * 띄워쓰기를 &lt;br&gt; 로 변환
		 * @param $str String
		 * @return 
		 * 
		 */			
		public static function strEnterBR($str:String):String
		{		   
			var result_str:String = $str;
			var arr:Array;
			var i:uint;
			var brArr:Array = [];
			var total:uint;			
			if (result_str.indexOf("\n") != -1 || result_str.indexOf("\r") != -1) {
				if (result_str.indexOf("\n") != -1) result_str = whiteSpace(result_str);
			  	else if (result_str.indexOf("\r") != -1) result_str = whiteSpace(result_str);
			}
		  	return result_str;
		}
		
		/**
		 * Whitespace convert $replace
		 * @param $str String
		 * @param $replace Replace string
		 * @param $one Whitespace
		 * @param $two Whitespace
		 * @return 
		 * 
		 */		
		public static function whiteSpace($str:String, $replace:String="<br>", $one:String="\n", $two:String="\r"):String
		{
			var arr:Array = $str.split($one);
			var i:uint;
			var brArr:Array = [];
			var total:uint = arr.length;
			for (i=0; i<total; i++) {
				var tmp:String = String(arr[i]).split($two)[0];
				brArr.push(trimBoth(tmp));
			}
			var brTotal:uint = brArr.length;				
			var brStr:String = "";
			for (i=0; i<brTotal; i++) {
				brStr += brArr[i];
				if (i < brTotal - 1) {
					brStr += $replace;
				}
			}
			return brStr;
		}
		
		/**
		 * $code convert $change
		 * <p>
		 * 문자열에 해당 코드가있으면 변환코드로 수정해서 리턴 
		 * @param $str String
		 * @param $code Code
		 * @param $change Convert String
		 * @return 
		 * 
		 */			
		public static function strCodeChange($str:String, $code:String="^", $change:String="&"):String
		{		   
			if ($str == null) return "";
			else return $str.split($code).join($change);
		}
		
		/**
		 * Cutting textfield (support multiline)
		 * <p>
		 * 텍스트필드가 지정된 높이보다 길면 잘라냄 (multiline 지원) 
		 * @param $txtfield Textfield
		 * @param $textWidth Textfield width
		 * @param $textHeight Textfield height
		 * @param $replaceText Replace text
		 * 
		 */			
		public static function strLimitMulti($txtfield:TextField, $textWidth:int=30, $textHeight:int=30, $replaceText:String=".."):void
		{
			var maxX:Number = 0;
			var maxY:Number = 4;
			var replace:Boolean = false;
			
			if (!$txtfield.multiline) {
				if ($txtfield.width > $textWidth) {
		            maxX = $textWidth;
		            maxY = $txtfield.getLineMetrics(0).height >> 1;
		            replace = true;
		        }
			} else {
				var metricHeight:Number;
				var total:int = $txtfield.numLines
				for (var i:int=0; i<total; ++i) {
					metricHeight = $txtfield.getLineMetrics(i).height;
					if (maxY + metricHeight < $textHeight) {
						maxY += metricHeight;
					} else {
						maxX = $txtfield.width - 15;
						maxY -= 10;
						replace = true;
						break;
					}
				}
			}
			if (replace) {
				var end:int = $txtfield.getCharIndexAtPoint(maxX, maxY);
				if (end > 0) $txtfield.replaceText(end, $txtfield.length, $replaceText);
			}
		}
		
		/**
		 * Trim blank string front 
		 * @param $value String
		 * @return 
		 * 
		 */			
		public static function trimFront($value:String):String 
		{
			var str:String = "";
			var isStart:Boolean = false;
			var i:uint;
			var total:uint = $value.length;
			for(i=0; i<total; i++){
				if($value.charAt(i) != " ") isStart = true;
				if(isStart == true) str += $value.charAt(i);
			}   
  			return str;			
		}	
		
		/**
		 * Trim blank string back
		 * @param $value String
		 * @return 
		 * 
		 */		
		public static function trimBack($value:String):String 
		{
			var str:String = "";
			var isStart:Boolean = false;
			var i:uint;
			var total:uint = $value.length;
			for(i=0; i<total; i++){
				var index:int = $value.length - (i + 1);
				if($value.charAt(index) != " ") isStart = true;
				if(isStart == true) str = $value.charAt(index) + str;
			}   
			return str;
		}
		
		/**
		 * Trim blank string both
		 * @param $value String
		 * @return 
		 * 
		 */		
		public static function trimBoth($value:String):String 
		{
			var str:String;
			str = trimFront($value);
			str = trimBack(str);
			return str;
		}
		
		/**
		 * Trim blank string all
		 * @param $value String
		 * @return 
		 * 
		 */
		public static function removeWhite($value:String):String 
		{
			return $value.split(" ").join("");
		}

		/**
		 * Check e-mail
		 * @param $value E-mail
		 * @return 
		 * 
		 */			
		public static function checkEmail($value:String):Boolean
		{ 
			if($value.indexOf("@") < 1){
				trace("'@'문자가 빠지거나 맨 처음에 올 수 없습니다");
				return false;
			}
			   
			if($value.indexOf(".") < -1){
				trace("'.'문자가 빠지거나 맨 처음에 올 수 없습니다");
				return false;
			}
			   
			if($value.indexOf("@") != $value.lastIndexOf("@")){
				trace("'@'는 두 개이상 들어갈 수 없습니다.");
				return false;
			}
			   
			if($value.indexOf(".") - $value.indexOf("@") < 2){
				trace("'.'이 '@'보다 먼저 나올 수 없으며 '@' 바로 다음에 '.'이 올수 없습니다");
				return false;
			}
			   
			if($value.lastIndexOf(".") == $value.length-1){
				trace("마지막에 '.'이 올 수 없습니다");
			}
			   
			var lastStrLen:Number = $value.substr($value.lastIndexOf(".")+1).length;
			if(lastStrLen < 2 || lastStrLen > 4){
				trace("도메인명의 마지막 문자는 영문 2~4개 이어야 합니다.");
				return false;
			}
			   
			return true;
		}
		 
		/**
		 * 주민번호 체크 
		 * <br>Only korean
		 * @param $value1 String
		 * @param $value2 String
		 * @return 
		 * 
		 */		
		public static function checkJumin($value1:String, $value2:String):Boolean
		{
			var len1:Number = $value1.length;
			var len2:Number = $value2.length;			   
			// 문자길이체크
			if(len1 != 6){
				trace("주민번호 앞자리 길이가 정확하지 않습니다");
				return false;
			}
			if(len2 != 7){
				trace("주민번호 뒷자리 길이가 정확하지 않습니다");
				return false;
			}			   
			// 생년월일 체크
			var bYear:String = $value1.substr(0,2); // 연도 뒷자리
			var month:Number = Number($value1.substr(2,2)); // 월
			var day:Number = Number($value1.substr(4,2)); // 일			   
			var yunYear:Boolean; // 윤년여부
			var fYear:String; // 연도 앞자리			   
			var sex_no:Number = Number($value2.charAt(0)); // 성별부분			   
			if(sex_no < 1 || sex_no > 4){
				trace("주민번호 뒷자리의 시작은 1~4입니다");
				return false;
			} else {
				if(sex_no == 3 || sex_no == 4){ // 2000년대 출생일 경우
					fYear = "20";
				} else { // 1900년대 출생일 경우
					fYear = "19";
				}
			}			   
			var birthYear:Number = Number(fYear + bYear); // 출생년도			   
			// 윤년여부
			if(birthYear%4 == 0 && birthYear%100 != 0){ 
				yunYear = true;
			} else {
				if(birthYear%400 == 0){
					yunYear = true;
				} else {
					yunYear = false;
				}
			}			   
			if(month < 1 || month > 12){
				trace("월이 맞지 않습니다");
				return false;
			}			   
			if(day < 1 || day > 31){
				trace("일이 맞지 않습니다");
				return false;
			}			   
			var m30_ary:Array = [4, 6, 9, 11];
			var isThirtyDays:Boolean = false;			   
			for(var i:int=0; i<m30_ary.length; i++){
				if(m30_ary[i] == month) isThirtyDays = true;
			}			   
			if(isThirtyDays == true && day > 30){ // 30일까지 있는 달인데 일이 30일이 넘어가는 경우
				trace("30일까지밖에 없는 달입니다");
				return false;
			}			   
			if(month == 2){
				if(day < 1 || day > 29){
					trace("2월은 최대 29일까지입니다.");
					return false;
				}
				if(yunYear == false && day > 28){ // 평년인데 28일이 넘어가는 경우
					trace("평년에는 28일까지만 입니다.");
					return false;
				}
			}			   
			return true;
		}
	}
}